﻿//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Licensed under the MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////
#pragma once

// std headers
#include <memory>

// qt headers
#include <QAbstractItemModel>
#include <QPersistentModelIndex>
#include <QList>
#include <QVector>
#include <QStringList>
#include <QMap>

//custom headers
#include "IProjectComponent.h"
#include "IDetailedProjectComponent.h"


class QImage;

namespace gmepgcs
{
    class ProjectCloudComponentService;
    class UrlImageProvider;
}

namespace gmepgcs
{
    class ListItemModel :public QAbstractItemModel
    {
        Q_OBJECT

    public:
        ListItemModel(QObject *parent = 0);
        ~ListItemModel();

    public:
        int rowCount(const QModelIndex &parent = QModelIndex()) const;
        int columnCount(const QModelIndex &parent = QModelIndex()) const;
        QVariant data(const QModelIndex &index, int role) const;
        bool setData(const QModelIndex &index, const QVariant &value, int role);
        virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
        virtual QModelIndex parent(const QModelIndex &child) const;

    public:
        void SetComponents(std::vector<std::shared_ptr<IProjectComponent>> components);
        void UpdateThumbnail(std::wstring imageKey, std::shared_ptr<QImage> spImage);
        void RefreshComponent(const std::shared_ptr<IDetailedProjectComponent> detailedProjectComponent);
        void ChangeCheckStates(Qt::CheckState state);
        void ChangeCheckState(IProjectComponent *compoenent, bool checked);

    signals:
        void CheckStatesChanged(Qt::CheckState state, int32_t checkedCount);
        void ComponentCheckStateChanged(IProjectComponent *component, const bool &checked);
        void ListUpdated();

    private:
        void OnItemCheckStateChanged();

    private:
        std::vector<std::shared_ptr<IProjectComponent>> m_Components;
        std::shared_ptr<UrlImageProvider> m_spUrlThumbnailProvider;
        QMap<std::wstring, bool> m_mpCheckSates;
        QMap<std::wstring, IProjectComponent*> m_ReadyToOperationList;
        
    };
}
